#include<iostream>
#include<unistd.h>
#include<fcntl.h>

using namespace std;

void SetNonblock(int fd)
{
    int fl=fcntl(fd,F_GETFL);
    if(fl<0)
    {
        cerr<<"fcntl error"<<endl;
        exit(0);
    }
    fcntl(fd,F_SETFL,fl|O_NONBLOCK);
}

int main()
{
    SetNonblock(0);
    while(true)
    {
        char buffer[1024];
        ssize_t s=read(0,buffer,sizeof(buffer)-1);
        if(s>0)
        {
            buffer[s]=0;
            cout<<"echo# "<<buffer<<endl;
        }
        else if(s==0)
        {
            cout<<"end stdin"<<endl;
            break;
        }
        else
        {
            //非阻塞等待，如果数据没准备好，返回值会按照出错返回，s==-1
            //数据没有准备好 vs 真的出错了：处理方式一定是不一样的。s无法区分
            //数据没有准备好，算读取错误吗？不算。read，recv以出错的形式告知上层，数据还没有准备好
            if(errno==EWOULDBLOCK || errno==EAGAIN)
            {
                cout<<"OS底层数据还没有就绪，errno："<<errno<<endl;
                //
            }
            else if(errno==EINTR)
            {
                cout<<"read被信号中断"<<endl;
            }
            else
            {
                cout<<"读取失败"<<endl;
            }
        }
        sleep(1);
    }
    return 0;
}